/*
 * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SLE_SSAP_CLIENT_SERVICE_H
#define SLE_SSAP_CLIENT_SERVICE_H

#include <memory>
#include "sle_ssap_client_parcel.h"
#include "sle_ssap_client_config.h"
#include "sle_error_code.h"

namespace OHOS {
namespace NearLink {
namespace SleStandard {
class ISsapClientCallback{
public:
    virtual ~ISsapClientCallback() = default;
    virtual void OnFindService(
        uint8_t clientId, uint16_t connectId, const ClientFindServiceRes &result, SleErrorCode errCode);
    virtual void OnFindProperty(
        uint8_t clientId, uint16_t connectId, const ClientFindPropertyRes &result, SleErrorCode errCode);
    virtual void OnFindComplete(
        uint8_t clientId, uint16_t connectId, const ClientFindStructureRes &result, SleErrorCode errCode);
    virtual void OnWriteResult(
        uint8_t clientId, uint16_t connectId, const ClientWriteRes &result, SleErrorCode errCode);
    virtual void OnReadResult(
        uint8_t clientId, uint16_t connectId, const ClientHandleValue &value, SleErrorCode errCode);
    virtual void OnReadByUuidComplete(
        uint8_t clientId, uint16_t connectId, const ClientReadByUuidCmpRes &result, SleErrorCode errCode);
    virtual void OnExchangeInfo(
        uint8_t clientId, uint16_t connectId, const SsapMtuInfo &info, SleErrorCode errCode);
    virtual void OnNotification(
        uint8_t clientId, uint16_t connectId, const ClientHandleValue &value, SleErrorCode errCode);
    virtual void OnIndication(
        uint8_t clientId, uint16_t connectId, const ClientHandleValue &value, SleErrorCode errCode);
};
class SleSsapClientService {
public:
    SleSsapClientService();
    ~SleSsapClientService();

    static SleSsapClientService *GetInstance();
    SleErrorCode RegisterSsapClient(const Uuid &uuid, uint8_t &clientId);
    SleErrorCode UnregisterSsapClient(uint8_t clientId);
    SleErrorCode FindSsapStructure(uint8_t clientId, uint16_t connectId, const SsapClientFindStructure &param);
    SleErrorCode ReadRequestByUuid(uint8_t clientId, uint16_t connectId, const SsapClientReadReqByUUID &param);
    SleErrorCode ReadRequest(uint8_t clientId, uint16_t connectId, uint16_t handle, uint8_t type);
    SleErrorCode WriteRequest(uint8_t clientId, uint16_t connectId, const SsapClientHandleValue &value);
    SleErrorCode WriteCommand(uint8_t clientId, uint16_t connectId, const SsapClientHandleValue &value);
    SleErrorCode ExchangeInfo(uint8_t clientId, uint16_t connectId, uint32_t mtu, uint16_t version);
    SleErrorCode RegisterSsapClientCallback(ISsapClientCallback &callback);
    SleErrorCode UnregisterSsapClientCallback(ISsapClientCallback &callback);

private:
    class SleSsapClientServiceCallback;
    std::unique_ptr<SleSsapClientServiceCallback> serviceCallback_;
    ISsapClientCallback *callback_ = nullptr;
};
} // SleStandard
} // NearLink
} // OHOS
#endif //SLE_SSAP_CLIENT_SERVICE_H